/*
 * Fichier : CopieListe.java
 * Créé le : 18 février 2007.
 * Modifié : 15 avril 2012.
 * Auteurs : Sébastien ESTIENNE.
 * SiteWeb : http://www.prog-info.org/
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package chapitre12;



import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;



/**
 * <p>Classe de copie de liste à liste.</p>
 * @author Sébastien ESTIENNE.
 */
public class CopieListe extends JFrame
{
   /**
    * <p>Serial version UID.</p>
    */
   private static final long serialVersionUID = 1L;

   /** Première liste de pays. */
   private JList listePays1;

   /** Seconde liste de pays. */
   private JList listePays2;

   /** Modèle pour la liste 1. */
   private DefaultListModel modeleListe1;

   /** Modèle pour la liste 2. */
   private DefaultListModel modeleListe2;

   /** Panneau contenant les boutons. */
   private JPanel panneau;

   /** Le boutons pour la copier de la liste 1 à la liste 2. */
   private JButton boutonCopier1;

   /** Le boutons pour la copier de la liste 2 à la liste 1. */
   private JButton boutonCopier2;

   /** Un tableau avec la liste de tous les pays. */
   private String[] pays = {"Allemagne", "Autriche", "Belgique", "Danemark", "Espagne", "Finlande",
         "France", "Irelande", "Islande", "Italie", "Norvège", "Pays-Bas", "Portugal",
         "Royaume-Uni", "Suède", "Suisse"};


   /**
    * <p>Constructeur initialisant la fenêtre.</p>
    */
   public CopieListe()
   {
      super("Copie de liste à liste");

      // Conteneur.
      Container conteneur = getContentPane();

      // Change le gestionnaire de canvas.
      conteneur.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));

      // Initialisation de la première liste.
      this.modeleListe1 = new DefaultListModel();
      for(int i = 0; i < this.pays.length; i++)
      {
         this.modeleListe1.addElement(this.pays[i]);
      }
      this.listePays1 = new JList(this.modeleListe1);
      this.listePays1.setVisibleRowCount(7);
      this.listePays1.setFixedCellWidth(120);
      this.listePays1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
      JScrollPane scroll1 = new JScrollPane(this.listePays1,
            ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
      conteneur.add(scroll1);

      // Initialisation du panneau.
      this.panneau = new JPanel();
      this.panneau.setLayout(new GridLayout(2, 1, 10, 10));
      conteneur.add(this.panneau);

      // Initialisation du premier bouton.
      this.boutonCopier1 = new JButton(" >> ");
      this.boutonCopier1.addActionListener(new ActionListener()
      {
         /**
          * p>Invoqué quand une action se produit.</p>
          * @param e Un événement qui indique qu'une action s'est produite.
          */
         public void actionPerformed(ActionEvent e)
         {
            // Récupère les objets sélectionnés.
            Object[] paysSelectionnes = CopieListe.this.listePays1.getSelectedValues();

            // Récupère dans un tableau les objets de la liste2 et ceux sélectionnés de la liste1.
            int taille = paysSelectionnes.length + CopieListe.this.modeleListe2.getSize();
            Object[] objets = new Object[taille];
            CopieListe.this.modeleListe2.copyInto(objets);
            for(int i = 0; i < paysSelectionnes.length; i++)
            {
               objets[CopieListe.this.modeleListe2.getSize() + i] = paysSelectionnes[i];
            }

            // Trie le tableau d'objets.
            Arrays.sort(objets);

            // Rempli la liste 2 avec les objets triés.
            CopieListe.this.modeleListe2.removeAllElements();
            for(int i = 0; i < objets.length; i++)
            {
               CopieListe.this.modeleListe2.addElement(objets[i]);
            }

            // Enlève les objets sélectionnés de la liste 1.
            for(int i = 0; i < paysSelectionnes.length; i++)
            {
               CopieListe.this.modeleListe1.removeElement(paysSelectionnes[i]);
            }
         }
      });
      this.panneau.add(this.boutonCopier1);

      // Initialisation du second bouton.
      this.boutonCopier2 = new JButton(" << ");
      this.boutonCopier2.addActionListener(new ActionListener()
      {
         /**
          * p>Invoqué quand une action se produit.</p>
          * @param e Un événement qui indique qu'une action s'est produite.
          */
         public void actionPerformed(ActionEvent e)
         {
            // Récupère les objets sélectionnés.
            Object[] paysSelectionnes = CopieListe.this.listePays2.getSelectedValues();

            // Récupère dans un tableau les objets de la liste1 et ceux sélectionnés de la liste2.
            int taille = paysSelectionnes.length + CopieListe.this.modeleListe1.getSize();
            Object[] objets = new Object[taille];
            CopieListe.this.modeleListe1.copyInto(objets);
            for(int i = 0; i < paysSelectionnes.length; i++)
            {
               objets[CopieListe.this.modeleListe1.getSize() + i] = paysSelectionnes[i];
            }

            // Trie le tableau d'objets.
            Arrays.sort(objets);

            // Rempli la liste 1 avec les objets triés.
            CopieListe.this.modeleListe1.removeAllElements();
            for(int i = 0; i < objets.length; i++)
            {
               CopieListe.this.modeleListe1.addElement(objets[i]);
            }

            // Enlève les objets sélectionnés de la liste 2.
            for(int i = 0; i < paysSelectionnes.length; i++)
            {
               CopieListe.this.modeleListe2.removeElement(paysSelectionnes[i]);
            }
         }
      });
      this.panneau.add(this.boutonCopier2);

      // Initialisation de la seconde liste.
      this.modeleListe2 = new DefaultListModel();
      this.listePays2 = new JList(this.modeleListe2);
      this.listePays2.setVisibleRowCount(7);
      this.listePays2.setFixedCellWidth(120);
      this.listePays2.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
      JScrollPane scroll2 = new JScrollPane(this.listePays2,
            ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
      conteneur.add(scroll2);

      // Propriétés de la fenêtre.
      setLocation(50, 50);
      setSize(400, 180);
      setVisible(true);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }


   /**
    * <p>Commence l'exécution du programme.</p>
    * @param args Les paramètres de la ligne de commande.
    */
   public static void main(String[] args)
   {
      new CopieListe();
   }
}
